home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 April: Mac OS SDK / Dev.CD Apr 00 SDK1.toast / Development Kits / Mac OS / Open Transport 1.3 / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTTcpCatchSample.cp < prev    next >
Encoding:
Text File  |  1998-04-30  |  8.9 KB  |  411 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTTcpCatchSample.cp
  3.  
  4.     Contains:    TCP catch sample
  5.  
  6.     Copyright:    © 1993-1997 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10.  
  11. // OT TCP Catch Test Program (as an SIOW Tool)
  12.  
  13. #define lint
  14. #include <QuickDraw.h>
  15. #include <stdio.h>
  16. #include <StdLib.h>
  17. #include <TextUtils.h>
  18. #include <strings.h>
  19. #include <String.h>
  20. #include <Events.h>
  21. #include <Menus.h>
  22. #include <Devices.h>
  23. #include <OpenTransport.h>
  24. #include <OpenTptInternet.h>
  25.  
  26.  
  27. /*******************************************************************************
  28. ** GLOBAL VARIABLES
  29. ********************************************************************************/
  30.  
  31. #define kMaxDataLen 256
  32.  
  33. const size_t    kMyPoolSize = 60000;
  34.  
  35. InetPort    gCatchPort        = 0;
  36. InetHost    gCatchIpAddr    = 0;
  37. InetPort      gPitchPort        = 0;
  38. InetHost    gPitchIpAddr    = 0;
  39.  
  40. unsigned short gBindCompleted        = 0;
  41. unsigned short gDataToRead            = 0;
  42. unsigned short gCallRcvOrdDiscon    = 0;
  43.  
  44. OTEventCode    gCode;
  45. TEndpoint*    gCookie;
  46. OSStatus    gErr;
  47.  
  48. unsigned char data[kMaxDataLen];
  49.  
  50. struct InetAddress reqsin, retsin, rcvsin;
  51.  
  52. /*******************************************************************************
  53. ** Function Prototypes
  54. ********************************************************************************/
  55.  
  56. void    Inits(void);
  57. void    CleanUp(void);
  58. void    Idle(void);    
  59. void    DoIt(void);
  60. Boolean    UserAbort(void);
  61.  
  62.  
  63. /*******************************************************************************
  64. **  main function
  65. ********************************************************************************/
  66.  
  67. void main()
  68. {
  69.     Inits();
  70.     DoIt();
  71.     CleanUp();
  72. }
  73.  
  74. /*******************************************************************************
  75. ** Initialize Quickdraw and ASLM
  76. ********************************************************************************/
  77.  
  78. void Inits()
  79. {
  80.     InitGraf(&qd.thePort);
  81.     if (InitOpenTransport() != kOTNoError)
  82.     {
  83.         fprintf(stderr, "OTTcpCatch: Could not initialize ASLM, exiting\n");
  84.         exit(1);
  85.     }
  86. }
  87.  
  88. /*******************************************************************************
  89. ** Clean up at the end
  90. ********************************************************************************/
  91.  
  92. void CleanUp()
  93. {
  94.     CloseOpenTransport();
  95. }
  96.  
  97. /*******************************************************************************
  98. ** Idle
  99. ********************************************************************************/
  100.  
  101. void Idle()
  102. {
  103.     SystemTask();
  104. }
  105.  
  106. /*******************************************************************************
  107. ** EventHandler
  108. ********************************************************************************/
  109.  
  110. pascal void EventHandler(void*, OTEventCode event, OTResult result, void* cookie)
  111. {
  112.     OTEventCode tempevent = 0;
  113.  
  114.     switch(event)
  115.     {
  116.         case T_OPENCOMPLETE:
  117.                             gErr = (OSStatus)result;
  118.                             gCookie = (TEndpoint*) cookie;
  119.                             gCode = event;
  120.                             break;
  121.         case T_DATA:
  122.                             gDataToRead = 1;
  123.                             break;
  124.         case T_BINDCOMPLETE:
  125.                             gBindCompleted = 1;
  126.                             break;
  127.         case T_ORDREL:
  128.                             gCallRcvOrdDiscon = 1;
  129.                             break;
  130.         default:
  131. // OTDebugBreak("EventHandler got unexpected event");
  132.                             tempevent = event;
  133.                             break;
  134.     }
  135.     return;
  136. }
  137.  
  138. /*******************************************************************************
  139. ** DoIt
  140. ********************************************************************************/
  141.  
  142. void DoIt()
  143. {
  144.     TEndpoint*        ep = NULL;
  145.     TEndpointInfo    info;
  146.     TBind            req, ret;
  147.     TCall            mycall;
  148.     OSStatus        err = kOTNoError;
  149.     long            myport;
  150.     InetHost        myaddr;
  151.     char            mystr[255];
  152.     OTFlags            flags;
  153.     long            bytes = 0;
  154.  
  155.     myport = 0;
  156.     fprintf(stderr, "Catch port ? (enter TCP port number)\n");
  157.     if ( gets(mystr) != 0 )
  158.     {
  159.         stringtonum(mystr, &myport);
  160.         gCatchPort = (InetPort) myport;
  161.     }
  162.     myaddr = 0;
  163.     fprintf(stderr, "Catch IP address ? (enter IP address)\n");
  164.     if ( gets(mystr) != 0 )
  165.     {
  166.         if ( OTInetStringToHost(mystr, &myaddr) == 0 )
  167.         {
  168.             gCatchIpAddr = (InetHost) myaddr;
  169.         }
  170.     }
  171.     myport = 0;
  172.     fprintf(stderr, "Pitch port ? (enter TCP port number)\n");
  173.     if ( gets(mystr) != 0 )
  174.     {
  175.         stringtonum(mystr, &myport);
  176.         gPitchPort =(InetPort)  myport;
  177.     }
  178.     myaddr = 0;
  179.     fprintf(stderr, "Pitch IP address ? (enter IP address)\n");
  180.     if ( gets(mystr) != 0 )
  181.     {
  182.         if ( OTInetStringToHost(mystr, &myaddr) == 0 )
  183.         {
  184.             gPitchIpAddr = (InetHost) myaddr;
  185.         }
  186.     }
  187.     fprintf(stderr, "The program will listen for a packet on port <%d>\n", gCatchPort);
  188.     fprintf(stderr, "until \'cmd .\' keys are pressed\n");
  189.  
  190.     memset(&reqsin, 0, sizeof(struct InetAddress));
  191.     memset(&retsin, 0, sizeof(struct InetAddress));
  192.     memset(&rcvsin, 0, sizeof(struct InetAddress));
  193.     memset(&req, 0, sizeof(TBind));
  194.     memset(&ret, 0, sizeof(TBind));
  195.  
  196.     OTInitInetAddress(&reqsin, gCatchPort, gCatchIpAddr);
  197.  
  198.     do
  199.     {
  200.         //
  201.         // Now create a TCP
  202.         //
  203. #if 1
  204.         gCode = 0;
  205.         gCookie = NULL;
  206.         gErr = 0;
  207.         err = OTAsyncOpenEndpoint(OTCreateConfiguration(kTCPName), 0, 
  208.                                   &info, EventHandler, 0);
  209.         if ( err == 0 )
  210.         {
  211.             while ( gCode == 0 )
  212.                 OTIdle();
  213.             err = gErr;
  214.         }
  215.         if ( err != 0 )
  216.         {
  217.             ep = NULL;
  218.             fprintf(stderr,"ERROR: OpenEndpoint(\"TCP\") failed with %d\n", err);
  219.             break;
  220.         }
  221.         else
  222.         {
  223.             ep = gCookie;
  224.         }
  225. #else
  226.         ep = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, &info, &err);
  227.  
  228.         if ( ep == NULL || err != kOTNoError )
  229.         {
  230.             ep = NULL;
  231.             fprintf(stderr,"ERROR: OpenEndpoint(\"TCP\") failed with %d\n", err);
  232.             break;
  233.         }
  234.  
  235.         err = ep->SetSynchronous();
  236.         if ( err != kOTNoError )
  237.         {
  238.             fprintf(stderr, "ERROR: SetSynchronous() failed with %d\n", err);
  239.             break;
  240.         }
  241.  
  242.         //
  243.         // Install notifier we're going to use for testing
  244.         //
  245.         err = ep->InstallNotifier(&EventHandler, 0);
  246.         if ( err != kOTNoError )
  247.         {
  248.             fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  249.             break;
  250.         }
  251. #endif
  252.         //
  253.         // Try to bind
  254.         // 
  255.         req.addr.len = sizeof(struct InetAddress);
  256.         req.addr.buf = (unsigned char *) &reqsin;
  257.         req.qlen = 5;                                        // don't care for tcp
  258.         ret.addr.maxlen = sizeof(struct InetAddress);
  259.         ret.addr.buf = (unsigned char *) &retsin;
  260.  
  261.         // bind tcp to current address and port
  262.         err = ep->Bind(&req, &ret);
  263.         if ( err != kOTNoError )
  264.         {
  265.             fprintf(stderr, "ERROR: Bind() failed with %d\n", err);
  266.             break;
  267.         }
  268.  
  269.         err = ep->SetSynchronous();
  270.         if ( err != kOTNoError )
  271.         {
  272.             fprintf(stderr, "ERROR: SetSynchronous() failed with %d\n", err);
  273.             break;
  274.         }
  275.  
  276.         err = ep->SetBlocking();
  277.         if ( err != kOTNoError )
  278.         {
  279.             fprintf(stderr, "ERROR: SetBlocking() failed with %d\n", err);
  280.             break;
  281.         }
  282.  
  283.         memset(&mycall, 0, sizeof(TCall));
  284.  
  285.         mycall.addr.maxlen = sizeof(struct InetAddress);
  286.         mycall.addr.len = sizeof(struct InetAddress);
  287.         mycall.addr.buf = (unsigned char *) &rcvsin;
  288.         mycall.opt.maxlen = 0;
  289.         mycall.opt.buf = 0;
  290.         mycall.udata.maxlen = 0;
  291.  
  292.         err = ep->Listen(&mycall);
  293.         if ( err != kOTNoError )
  294.         {
  295.             fprintf(stderr, "ERROR: Listen() failed with %d\n", err);
  296.             break;
  297.         }
  298.  
  299.         ep->Accept(ep, &mycall);
  300.         if ( err != kOTNoError )
  301.         {
  302.             fprintf(stderr, "ERROR: Accept() failed with %d\n", err);
  303.             break;
  304.         }
  305.  
  306.         err = ep->SetAsynchronous();
  307.         if ( err != kOTNoError )
  308.         {
  309.             fprintf(stderr, "ERROR: SetAsynchronous() failed with %d\n", err);
  310.             break;
  311.         }
  312.  
  313.         do
  314.         {
  315.             //
  316.             // Try to receive some data
  317.             //
  318.             if ( gDataToRead == 1 )
  319.             {
  320.                 gDataToRead = 0;
  321.                 bytes = ep->Rcv(data, kMaxDataLen, &flags);
  322.                 if (bytes >= 0)
  323.                     fprintf(stderr, "Packet received\nsize: <%d> data: %s", bytes, data);
  324.                 else
  325.                     fprintf(stderr, "ERROR: Rcv() failed with %d\n", bytes);
  326.                 break;
  327.             }
  328.             Idle();
  329.         } while (!UserAbort());
  330.     } while (false);
  331.  
  332.     if ( ep != NULL )
  333.     {
  334.  
  335.         err = ep->SetSynchronous();
  336.         if ( err != kOTNoError )
  337.         {
  338.             fprintf(stderr, "ERROR: SetSynchronous() failed with %d\n", err);
  339.             return;
  340.         }
  341.  
  342.         err = ep->SndOrderlyDisconnect();
  343.         if ( err != kOTNoError )
  344.         {
  345.             if (err == kOTLookErr)
  346.                 fprintf(stderr, "SndOrderlyDisconnect() returns %d\n", err);
  347.             else
  348.                 fprintf(stderr, "ERROR: SndOrderlyDisconnect() failed with %d\n", err);
  349.         }
  350.     
  351.         while ( gCallRcvOrdDiscon == 0 )
  352.             Idle();
  353.         err = ep->RcvOrderlyDisconnect();
  354.         if ( err != kOTNoError )
  355.         {
  356.             fprintf(stderr, "ERROR: RcvOrderlyDisconnect() failed with %d\n", err);
  357.         }
  358.     
  359.         //
  360.         // Remove notifier
  361.         //
  362.         ep->RemoveNotifier();
  363.         //
  364.         // Try to Unbind
  365.         // 
  366.     /*
  367.         err = ep->Unbind();
  368.         if ( err != kOTNoError )
  369.         {
  370.             fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
  371.         }
  372.     */
  373.         //
  374.         // Get rid of endpoint.
  375.         //
  376.         err = OTCloseProvider(ep);
  377.         if ( err != kOTNoError )
  378.         {
  379.             fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
  380.         }
  381.     }
  382.     fprintf(stderr, "Bye\n");
  383. }
  384.  
  385. /*******************************************************************************
  386. ** IsPressed
  387. ********************************************************************************/
  388.  
  389. Boolean IsPressed(UInt16 k, KeyMap map)
  390. {
  391.     UInt8* keyMap    = (UInt8*)map;
  392.     return (keyMap[k >> 3] >> (k & 7) & 1);
  393. }
  394.  
  395. /*******************************************************************************
  396. ** CmdKey
  397. ********************************************************************************/
  398.  
  399. Boolean UserAbort()
  400. {
  401.     KeyMap    keyMap;
  402.     
  403.     GetKeys(keyMap);
  404.     if ( IsPressed(0x37, keyMap) && 
  405.         (IsPressed(0x2F, keyMap) || IsPressed(0x41, keyMap)) )
  406.         return true;
  407.     else
  408.         return false;
  409. }
  410.  
  411.